/*******************************************************************************
  * 文件：Hardware.c
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：硬件相关
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "Hardware.h"
#include "r_cg_macrodriver.h"

/* 宏定义 *********************************************************************/
// 临界区堆栈深度
#define u8CRITICAL_STACK_MAX_DEPTH    ((U8) 8)

/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
static U8 u8CriticalStackPointer = 0;                             // 临界区堆栈指针
static __istate_t axCriticalStack[u8CRITICAL_STACK_MAX_DEPTH];    // 临界区堆栈数组

/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名：Hardware_Init
  * 功  能：硬件初始化
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_Init(void)
{
    // 初始化系统
//    Hardware_InitSystem();
//    // 初始化外设
//	Hardware_InitWDT();      // 初始化看门狗
//	Hardware_InitIO();       // 初始化IO
//	Hardware_InitTimer();    // 初始化定时器
//	Hardware_InitUart();     // 初始化串口
//	Hardware_InitADC();      // 初始化ADC
//    // 延时1ms
//    Hardware_RestartWDT();
//    Hardware_DelayUs(1000);
//    Hardware_RestartWDT();
}

/*******************************************************************************
  * 函数名：Hardware_DisableInterrupt
  * 功  能：关闭中断
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_DisableInterrupt(void)
{
    __disable_interrupt();
}

/*******************************************************************************
  * 函数名：Hardware_EnableInterrupt
  * 功  能：打开中断
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_EnableInterrupt(void)
{
    __enable_interrupt();
}

/*******************************************************************************
  * 函数名：Hardware_EnterCritical
  * 功  能：进入临界区
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_EnterCritical(void)
{
    __istate_t xState;

    // 关闭中断
    xState = __get_interrupt_state();
    __disable_interrupt();
    // 保存堆栈
    axCriticalStack[u8CriticalStackPointer] = xState;
    // 更新堆栈指针
    u8CriticalStackPointer++;
}

/*******************************************************************************
  * 函数名：Hardware_ExitCritical
  * 功  能：退出临界区
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_ExitCritical(void)
{
    __istate_t xState;

    // 更新堆栈指针
	u8CriticalStackPointer--;
    // 恢复堆栈
    xState = axCriticalStack[u8CriticalStackPointer];
    __set_interrupt_state(xState);
}

/*******************************************************************************
  * 函数名：Hardware_DelayUs
  * 功  能：延时微秒
  * 参  数：U32 u32Us - 微秒
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Hardware_DelayUs(U32 u32Us)
{
    volatile U32 u32Count = u32Us;

    while(u32Count--)
    {
        // 32M晶振，32个nop是1us
        __no_operation();__no_operation();__no_operation();__no_operation();
        __no_operation();__no_operation();__no_operation();__no_operation();
        __no_operation();__no_operation();__no_operation();__no_operation();
        __no_operation();__no_operation();__no_operation();__no_operation();
//        __no_operation();__no_operation();__no_operation();__no_operation();
//        __no_operation();__no_operation();__no_operation();__no_operation();
//        __no_operation();__no_operation();__no_operation();__no_operation();
//        __no_operation();__no_operation();__no_operation();__no_operation();
    }
}


/***************************** 文件结束 ***************************************/
